package com.hc.comm.utils;

import com.hc.comm.exception.BaseException;
import com.hc.comm.model.ResultModel;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Serializable;

public class ExceptionUtils implements Serializable {

	/**
	 * @Fields serialVersionUID : TODO
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 抛出异常
	 *
	 * @date 2015年12月2日 上午11:13:29
	 * @param message
	 *            void
	 */
	public static void throwBaseException(String message) {
		throw new BaseException(HttpStatus.INTERNAL_SERVER_ERROR.value(),
				message);
	}

	/**
	 * 抛出异常
	 *
	 * @date 2015年12月13日 下午4:56:20
	 * @param code
	 * @param message
	 *            void
	 */
	public static void throwBaseException(int code, String message) {
		throw new BaseException(HttpStatus.INTERNAL_SERVER_ERROR.value(), code,
				message);
	}

	/**
	 * 输出到客户端
	 *
	 * @date 2015年12月17日 下午3:30:05
	 * @param response
	 * @param code
	 * @param message
	 * @throws IOException
	 *             void
	 */
	public static void outputMessage(HttpServletResponse response, int code,
			String message) throws IOException {
		JsonUtils.outputMessage(response,
				JsonUtils.toJSONString(new ResultModel(
						HttpStatus.INTERNAL_SERVER_ERROR.value(), code,
						message)));
	}

	/**
	 * 根据请求类型输出json或跳转到异常页面
	 *
	 * @date 2015年12月22日 上午11:07:12
	 * @param response
	 * @param handler
	 * @param code
	 * @param message
	 *            void
	 * @throws IOException
	 */
	public static void throwBaseException(HttpServletResponse response,
			Object handler, int code, String message) throws IOException {
		if (handler instanceof HandlerMethod) {
			HandlerMethod handlerMethod = (HandlerMethod) handler;
			ResponseBody annotation = handlerMethod
					.getMethodAnnotation(ResponseBody.class);
			if (annotation != null) {
				ExceptionUtils.outputMessage(response, code, message);
				return;
			}
		}
		ExceptionUtils.throwBaseException(code, message);
	}

}
